From 01de315ff348fec5b7c17a6ae94ce517d23a2f0c Mon Sep 17 00:00:00 2001
From: Daniel Kolesa <daniel@octaforge.org>
Date: Sat, 5 Nov 2022 23:39:29 +0100
Subject: [PATCH] rudimentary lsan musl fixes on some archs (ppc64le)

---
 .../sanitizer_common/sanitizer_linux_libcdep.cpp  | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp
index d74851c43..f13fc84be 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp
@@ -29,6 +29,14 @@
 #include "sanitizer_procmaps.h"
 #include "sanitizer_solaris.h"
 
+#if defined(__powerpc__)
+#define DTP_OFFSET 0x8000
+#elif SANITIZER_RISCV64
+#define DTP_OFFSET 0x800
+#else
+#define DTP_OFFSET 0
+#endif
+
 #if SANITIZER_NETBSD
 #define _RTLD_SOURCE  // for __lwp_gettcb_fast() / __lwp_getprivate_fast()
 #endif
@@ -289,6 +297,7 @@ static uptr ThreadDescriptorSizeFallback() {
   return val;
 }
 
+#if SANITIZER_GLIBC
 uptr ThreadDescriptorSize() {
   uptr val = atomic_load_relaxed(&thread_descriptor_size);
   if (val)
@@ -303,6 +312,9 @@ uptr ThreadDescriptorSize() {
   atomic_store_relaxed(&thread_descriptor_size, val);
   return val;
 }
+#else
+uptr ThreadDescriptorSize() { return 0; }
+#endif
 
 #if defined(__mips__) || defined(__powerpc64__) || SANITIZER_RISCV64
 // TlsPreTcbSize includes size of struct pthread_descr and size of tcb
@@ -392,6 +404,7 @@ static int CollectStaticTlsBlocks(struct dl_phdr_info *info, size_t size,
     begin = (uptr)__tls_get_addr(mod_and_off);
 #endif
   }
+  begin -= DTP_OFFSET;
   for (unsigned i = 0; i != info->dlpi_phnum; ++i)
     if (info->dlpi_phdr[i].p_type == PT_TLS) {
       static_cast<InternalMmapVector<TlsBlock> *>(data)->push_back(
@@ -542,9 +555,11 @@ static void GetTls(uptr *addr, uptr *size) {
   else if (SANITIZER_FREEBSD)
     *size += 128;  // RTLD_STATIC_TLS_EXTRA
 #if defined(__mips__) || defined(__powerpc64__) || SANITIZER_RISCV64
+#if SANITIZER_GLIBC
   const uptr pre_tcb_size = TlsPreTcbSize();
   *addr -= pre_tcb_size;
   *size += pre_tcb_size;
+#endif
 #else
   // arm and aarch64 reserve two words at TP, so this underestimates the range.
   // However, this is sufficient for the purpose of finding the pointers to
-- 
2.38.1

